package educar.controllers;

import educar.gui.AdminDocenteCargoView;
import educar.gui.AdminDocenteMateriaView;
import educar.gui.AdminView;
import educar.gui.IView;
import educar.models.Alumno;
import educar.models.Persona;
import educar.models.User;
import educar.models.alumnoNotFound;
import educar.models.personaNotFound;
import educar.models.userNotFound;
import educar.models.Docente;
import educar.models.docenteNotFound;

//TODO: crear borrar completo
public class AdminDocenteController implements IController
{
    AdminView view;
    public static Docente apuntado;

    public void setView(IView view)
    {
        this.view = (AdminView)view;
        actualizarDocentes();
    }

    public void processItemList(String name, String item)
    {
        Docente docente = null;
        try
        {
            docente = Docente.getDocenteByDni(name);
            view.setDocenteNombre(docente.getNombre());
            view.setDocenteDni(docente.getDni());
            view.setDocenteApellido(docente.getApellido());
            apuntado = docente;

        }
        catch (docenteNotFound e)
        {
            e.printStackTrace();
        }
        try
        {
            User usuario = User.getUserByDniUserRole(docente.getDni(), "Docente");
            view.setDocenteContrasena(usuario.getPassword());
            view.setDocenteUsuario(usuario.getUsername());
        }
        catch (userNotFound e)
        {
            //simplemente mostramos los campos vacios
            //puede crearle un usuario con actualizar
            view.setDocenteContrasena("");
            view.setDocenteUsuario("");
        }
    }

    public void process(String model)
    {
        if (model.compareTo(AdminView.RESET) == 0)
            reset();
        else if (model.compareTo(AdminView.ACTUALIZAR) == 0)
            update();
        else if (model.compareTo(AdminView.GUARDARNUEVO) == 0)
            guardar();
        else if (model.compareTo(AdminView.BORRAR) == 0)
            borrar();
        else if (model.compareTo(AdminView.MATERIA) == 0)
        {
            if (apuntado != null)
                materia();
            else
                view.present("No hay docente seleccionado");
        }
        else if (model.compareTo(AdminView.CARGO) == 0)
        {
            if (apuntado != null)
                cargo();
            else
                view.present("No hay docente seleccionado");
        }
    }

    private void reset()
    {
        view.setDocenteNombre("");
        view.setDocenteDni("");
        view.setDocenteApellido("");
        view.setDocenteContrasena("");
        view.setDocenteUsuario("");
        setNullApuntado();

    }

    private void update()
    {
        try //TODO: informar que no se puede modificar dni
        {
            if (view.getDocenteContrasena().trim().isEmpty())
            {
                view.present("Error");
                return;
            }

            User u = User.getUserByDniUserRole(view.getDocenteDni(), "Docente");

            if (view.getDocenteUsuario().compareTo(u.getUsername()) != 0)
            {
                view.present("No se puede modificar el usuario");
                return;
            }

            u.setPassword(view.getDocenteContrasena());
            u.update();
        }
        catch (userNotFound e1)
        {
            view.present("Error");
        }
        try
        {
            Docente d = Docente.getDocenteByDni(view.getDocenteDni());
            d.setNombre(view.getDocenteNombre());
            d.setApellido(view.getDocenteApellido());
            d.update();
        }
        catch (docenteNotFound e)
        {
            view.present("Actualizacion no valida de datos del docente");
        }
    }

    private void guardar()
    {
        if (view.getDocenteDni().trim().isEmpty() ||
                view.getDocenteUsuario().trim().isEmpty() ||
                view.getDocenteContrasena().trim().isEmpty())
        {
            view.present("Error: Campos obligatorios vacíos");
            return;
        }
        Docente d = new Docente(view.getDocenteApellido(), view.getDocenteNombre(), view.getDocenteDni());
        User u = new User(view.getDocenteDni(), view.getDocenteUsuario(), view.getDocenteContrasena(), "Docente");

        if (!d.save())  //TODO: permitir guardar solo docente
        {
            view.present("Error al guardar");
            return;
        }
        if (!u.save())
        {
            view.present("Error al guardar");
            d.destroy(); //ya que el docente no se creo
            return;
        }

        actualizarDocentes();
    }

    private void actualizarDocentes()
    {
        ((AdminView)view).setDocentes(Docente.getAllArray());
    }

    private void borrar()
    {
        try
        {
            User usuario  = User.getUserByDniUserRole(view.getDocenteDni(), "Docente");
            usuario.destroy();
        }
        catch (userNotFound e1)
        {
            view.present("Usuario inexistente");
        }
        try
        {
            //no borra persona, porque puede ser un alumno ademas
            Docente docente = Docente.getDocenteByDni(view.getDocenteDni());
            docente.destroy();
            try
            {
                Alumno.getAlumnoByDni(view.getDocenteDni());
            }
            catch (alumnoNotFound a)
            {
                try
                {
                    Persona p = Persona.getPersonaByDni(view.getDocenteDni());
                    p.destroy();
                }
                catch (personaNotFound p)
                {}
            }

            reset();
            actualizarDocentes();
        }
        catch (docenteNotFound e)
        {
            view.present("Docente inexistente");
        }
    }

    public static Docente getApuntado()
    {
        return apuntado;
    }

    public void setNullApuntado()
    {
        apuntado = null;
    }

    private void materia()
    {
        new AdminDocenteMateriaView();
    }

    private void cargo()
    {
        new AdminDocenteCargoView();
    }
}
